/**
 * @file ustring.cpp
 * @brief Работа со строками и символами Юникода
 * @version 1.0
 * @date 12 августа 2011
 * @author Владимир Керимов
 */

#include <qua/ustring.h>
#include <cstring>

namespace qua
{
    const uchar uchar_null = to_uchar( '\0' );

    ustring to_ustring( const char* text, encode::codepage cp, size_t len )
    {
        if( !len ) len = std::strlen( text );
        ustring res;
        if( cp == encode::UTF8 )
        {
            int n, code;
            for( size_t i = 0; i < len; i += n )
            {
                n = encode::read_utf8( text, code );
                res += to_uchar( code );
                text += n;
            }
        }
        else
        {
            res.assign( len, uchar_null );
            for( size_t i = 0; i < len; i++ )
                res[i].set_char( text[i], cp );
        }
        return res;
    }

    ustring to_ustring( const wchar_t* text, size_t len )
    {
        if( !len ) len = std::wcslen( text );
        ustring res( len, uchar_null );
        for( size_t i = 0; i < len; i++ )
            res[i].set_ucs2( text[i] );
        return res;
    }

    std::string to_string( const ustring& text, encode::codepage cp )
    {
        std::string res( text.size(), '\0' );
        std::string::iterator dst = res.begin();
        ustring::const_iterator src = text.begin();
        for( ; src != text.end(); src++, dst++ )
            *dst = src->get_char( cp );
        return res;
    }

    std::wstring to_wstring( const ustring& text )
    {
        std::wstring res( text.size(), L'\0' );
        std::wstring::iterator dst = res.begin();
        ustring::const_iterator src = text.begin();
        for( ; src != text.end(); src++, dst++ )
            *dst = src->get_ucs2();
        return res;
    }

    std::string to_utf8( const ustring& text )
    {
        std::string res;
        res.reserve( text.size() * 2 );
        static char buf[7];
        int len;
        ustring::const_iterator src = text.begin();
        for( ; src != text.end(); src++ )
        {
            len = encode::to_utf8( src->get_code(), buf );
            buf[len] = '\0';
            res.append( buf );
        }
        return res;
    }
}
